/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import sv.com.compassion.entidades.Aula;
import sv.com.compassion.entidades.Beneficiario;
import sv.com.compassion.entidades.Biblias;
import sv.com.compassion.entidades.Visitas;

import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Interacción del mantenimiento Biblias
 * @author geovany
*/
public class BibliaAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Biblias biblia;

    private String fecFin;
    private String fecIni;
    private String idRanEda;
    private String idCdi;
    private String VERhis;
    private String formaBus;
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Biblia. 
 */
public BibliaAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        biblia = new  Biblias();
        
        biblia.setIdBeneficiario(new Beneficiario());
} 
/**
 * Busca el método que se ejecutara
 */ 
    @Override
    public String execute(){
        buscarMetodo(biblia);        
        return null;
    }
 /**
 * @param objeto de la entidad Beneficiario
 * Inserta una entrega de biblia usa la entidad Biblia
 */    
    @Override    
    public void agregarEntidad(Object o) {
        Biblias b;
        String query = "";
        try{
            Date    date    =   new Date();
            b = (Biblias)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();

            setIdBeneficiario(b.getIdBeneficiario().getIdBeneficiario());

            b.setAuAddUsr(Integer.parseInt(idUsuario));
            b.setAuAddDat(date);
            
            genericoDAO.save(b);
        }catch(Exception e){
            Logger.getLogger(BibliaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Biblia
 * Actualizar un registro de una biblia inactivo (-1) 
 */      
        @Override
    public void borrarEntidad(Object o) {
        List<Biblias> listBiblia;
        Biblias b;
        try{
            if(getId()!=null){
                listBiblia = genericoDAO.find("SELECT b FROM Biblias b WHERE b.idBiblia = " + getId(), null, null);
                if(!listBiblia.isEmpty()){
                    b = listBiblia.get(0);
                    b.setEstBiblia(-1);
                    genericoDAO.update(b);
                }
            }            
        }catch(Exception e){
            Logger.getLogger(BibliaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Biblia
 * Actualizar un registro usando la entidad Biblia
 */        
    @Override
    public void editarEntidad(Object o) {
        Biblias b;
        String query = "";
        try{
            Date    date    =   new Date();
            b = (Biblias)o;
            b.setIdBiblia(new Integer(getId()));
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
            setIdBeneficiario(b.getIdBeneficiario().getIdBeneficiario());

            setAuModUsr(Integer.parseInt(idUsuario));
            setAuModDat(date);
            
            genericoDAO.update(b);
        }catch(Exception e){
            Logger.getLogger(BibliaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * Este método realiza las búsquedas de Biblias para llenar el grid del mantenimiento
 * esperando los filtros:
 *       fecFin,
 *       fecIni,
 *       VERhis, 
 *       idCdi,
 *       codben,
 */     
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        
        List<Biblias> listaBiblia = null;
        String query="";
        fecFin = getRequest().getParameter("FecFin");
        fecIni = getRequest().getParameter("FecIni");
        idRanEda = getRequest().getParameter("IdRanEda");
        idCdi = getRequest().getParameter("IdCdi");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        String queryFecIni = "";
        String queryFecFin = "";
        String queryIdRanEda = "";
        String queryIdCdi = "";
        String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "b.idBeneficiario IN (SELECT y.idBeneficiario FROM Beneficiario y WHERE y.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
        }
        if(!fecIni.equals("") || !fecFin.equals("") || !idRanEda.equals("") || !idCdi.equals("")){
                if(!fecIni.equals("")){
                    queryFecIni = "b.fecBiblia >= '" + fecIni + "' and ";
                }
                if(!fecFin.equals("")){
                    queryFecFin = "b.fecBiblia <= '" + fecFin + "' and ";
                }
                if(!idRanEda.equals("")){
                    queryIdRanEda = "b.idBeneficiario IN (SELECT y.idBeneficiario FROM Beneficiario y WHERE y.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEda + "') and y.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEda + "')) and ";
                }
                if(!idCdi.equals("")){
                    queryIdCdi = "b.idBeneficiario IN (SELECT y.idBeneficiario FROM Beneficiario y WHERE y.idCdi = '" + idCdi + "') and ";
                }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        try{
                if(getSearch()!= null && getSearch().equals("true")){
                    
                }else{
                    
                    query = "SELECT b FROM Biblias b WHERE " +
                                queryAux +
                                queryFecIni +
                                queryFecFin +
                                queryIdRanEda +
                                queryIdCdi +
                                "(b.estBiblia like upper('" + verHistorial + "') or "
                                + "b.estBiblia like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY b.fecBiblia " + getSord();
                }
                if(formaBus.equals("1")){ 
                }else{
                    listaBiblia = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                    query = "SELECT COUNT(b) FROM Biblias b WHERE " +
                                queryAux +
                                queryFecIni +
                                queryFecFin +
                                queryIdRanEda +
                                queryIdCdi +
                                "(b.estBiblia like upper('" + verHistorial + "') or "
                                + "b.estBiblia like upper('" + verHistorialTemp + "'))";
                    total = genericoDAO.countRow(query);
                    //configuraciones basicas
                    jg.setPage(getPage());
                    jg.setRecords(total);
                    jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                    jg.setSord(getSord());
                    jg.setSidx(getSidx());
                    List<RowsGrid> rows = new ArrayList<RowsGrid>();

                    for(Biblias b: listaBiblia){
                        RowsGrid r = new RowsGrid(); 
                        r.setId(b.getIdBiblia().toString());
                        List cell = new ArrayList();

                        cell.add(b.getIdBeneficiario().getCodBeneficiario());
                        cell.add(b.getIdBeneficiario().getIdBeneficiario());

                        cell.add(b.getFecBiblia().toString());

                        cell.add(b.getCantBiblia());

                        if(b.getEstBiblia() == 1){
                            cell.add("Activo");
                        }else{
                            cell.add("Inactivo");
                        }

                        cell.add(b.getAuAddUsr());
                        cell.add(b.getAuAddDat().toString());

                        r.setCell(cell);
                        rows.add(r);
                    }

                    jg.setRows(rows);
                    JSONObject jo = JSONObject.fromObject(jg);
                    enviarJsonNavegador(getResponse(), jo);
            }  
        }catch(Exception e){
            Logger.getLogger(BibliaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }

    public Integer getIdBiblia() {
        return biblia.getIdBiblia();
    }

    public void setIdBiblia(Integer idBiblia) {
        biblia.setIdBiblia(idBiblia);
    }

    public String getFecBiblia() {
        return Fecha.date2String(biblia.getFecBiblia());
    }

    public void setFecBiblia(String fecBiblia) {
        try {
            biblia.setFecBiblia(Fecha.string2Date(fecBiblia));
        } catch (ParseException ex) {
            Logger.getLogger(VisitaAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getCantBiblia() {
        return biblia.getCantBiblia();
    }

    public void setCantBiblia(int cantBiblia) {
        biblia.setCantBiblia(cantBiblia);
    }

    public int getAuAddUsr() {
        return biblia.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        biblia.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(biblia.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            if(auAddDat!=null&& !auAddDat.equals("")){
                biblia.setAuAddDat(Fecha.string2Date(auAddDat));
            }
        } catch (ParseException ex) {
            Logger.getLogger(VisitaAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return biblia.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        biblia.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return biblia.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        biblia.setAuModDat(auModDat);
    }

    public int getEstBiblia() {
        return biblia.getEstBiblia();
    }

    public void setEstBiblia(int estBiblia) {
        biblia.setEstBiblia(estBiblia);
    }

    public Integer getIdBeneficiario() {
        return biblia.getIdBeneficiario().getIdBeneficiario();
    }

    public void setIdBeneficiario(Integer idBeneficiario) {
        biblia.getIdBeneficiario().setIdBeneficiario(idBeneficiario);
    }
 /**
 * Permite presentar el reporte de Biblias entregadas,
 * este puede recibir como filtros:
 *     fecFin,
 *     fecIni,
 *     idRanEda,
 *     idCdi,
 *     VERhis  <br>
 * @return  book ya completo con los datos que se desea expulsar
 */  
    @Override
    public void reporteXls() {
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            

                // capturamos la direccion absoluta de la plantilla del reporte en el servidor 
            //    String path = getServlet().getServletContext().getRealPath("/xlt/reporteConsolidadoSMS.xlt");
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportBiblias.xlt");
                FileInputStream stream = new FileInputStream(ruta); // obtenemos al archivo
                libro = new HSSFWorkbook(stream);      // el libro de trabajo

                response.setHeader("Pragma", "cache");          // Para mostrar ventana de apertura del archivo
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportBiblias.xls");
        
                libro = generarExcel(libro); 

                libro.write(out);
                out.flush();
                out.close();
        }catch(Exception e){
          e.printStackTrace();
        }         
    }
  private HSSFWorkbook generarExcel(HSSFWorkbook book) {
          /**
     * EL ESTILO DEL REPORTE
     */
      HSSFCellStyle styleBordere = book.createCellStyle();
      HSSFFont fontReport = book.createFont();
      fontReport.setFontName("Arial");
      fontReport.setFontHeightInPoints((short)10);
      styleBordere.setFont(fontReport);
      styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
      styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
      styleBordere.setBorderRight(styleBordere.BORDER_THIN);
      styleBordere.setBorderTop(styleBordere.BORDER_THIN);
      styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      
      List<Biblias> listaBiblia = null;
      
      HSSFSheet sheet = book.getSheet("Hoja1"); //nombre de la hoja 
      HSSFRow row = sheet.getRow(1);
      HSSFCell celda = null;
      Date      today    =   new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy");

      row = sheet.createRow(3);
      celda = row.createCell(4);
      celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
      celda.setCellStyle(styleBordere);


      Map session = ActionContext.getContext().getSession();
      String idUsuario = session.get("idUsuario").toString();
      String idCargo = session.get("idCargo").toString();


      String query="";
      fecFin = getRequest().getParameter("FecFin");
      fecIni = getRequest().getParameter("FecIni");
      idRanEda = getRequest().getParameter("IdRanEda");
      idCdi = getRequest().getParameter("IdCdi");
      VERhis = getRequest().getParameter("VERhis");
        
      String queryFecIni = "";
      String queryFecFin = "";
      String queryIdRanEda = "";
      String queryIdCdi = "";
      String queryAux = "";
      if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
          queryAux = "b.idBeneficiario IN (SELECT y.idBeneficiario FROM Beneficiario y WHERE y.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
      }
      if(!fecIni.equals("") || !fecFin.equals("") || !idRanEda.equals("") || !idCdi.equals("")){
                if(!fecIni.equals("")){
                    queryFecIni = "b.fecBiblia >= '" + fecIni + "' and ";
                }
                if(!fecFin.equals("")){
                    queryFecFin = "b.fecBiblia <= '" + fecFin + "' and ";
                }
                if(!idRanEda.equals("")){
                    queryIdRanEda = "b.idBeneficiario IN (SELECT y.idBeneficiario FROM Beneficiario y WHERE y.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEda + "') and y.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRanEda + "')) and ";
                }
                if(!idCdi.equals("")){
                    queryIdCdi = "b.idBeneficiario IN (SELECT y.idBeneficiario FROM Beneficiario y WHERE y.idCdi = '" + idCdi + "') and ";
                }
      }
      String verHistorial;
      String verHistorialTemp = "";
      if(VERhis.equals("true")){
          verHistorial = "-1";
          verHistorialTemp = "1";
      }else{
          verHistorial = "1";
          verHistorialTemp = "1";
      }

                    
        query = "SELECT b FROM Biblias b WHERE " +
                    queryAux +
                    queryFecIni +
                    queryFecFin +
                    queryIdRanEda +
                    queryIdCdi +
                    "(b.estBiblia like upper('" + verHistorial + "') or "
                    + "b.estBiblia like upper('" + verHistorialTemp + "'))"
                    + " ORDER BY b.fecBiblia desc";
   

                    listaBiblia = genericoDAO.find(query,null,null);

                    int col = 1;
                    int fila  = 10;
                    for(Biblias b: listaBiblia){
                        col =   2;
                        row = sheet.createRow(fila);
                        celda = row.createCell(col++);
                        celda.setCellValue(new HSSFRichTextString(String.valueOf(b.getIdBeneficiario().getCodBeneficiario().toString())));
                        celda.setCellStyle(styleBordere);
                       
                        celda = row.createCell(col++);
                        celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(b.getFecBiblia()))));
                        celda.setCellStyle(styleBordere);
                        
                        celda = row.createCell(col++);
                        celda.setCellValue(new HSSFRichTextString(String.valueOf(b.getCantBiblia())));
                        celda.setCellStyle(styleBordere);
           
                        fila++;

                    }
    
      return book;  
    }
    
            
}
